package jmine.tec.web.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;

import jmine.tec.web.servlet.util.WebSpringHelper;

import org.springframework.beans.factory.BeanFactory;

/**
 * Servlet base para servlets que precisem acessar a BeanFactory. Para funcionar corretamente a aplicação deve ser inicializada pelo
 * {@link InitServletContextListener} ou algum servlet derivado.
 * 
 * @created May 5, 2008
 * @author Gustavo Almeida
 */
public abstract class BeanFactoryServlet extends HttpServlet {

    private BeanFactory beanFactory;

    /**
     * Devolve a BeanFactory.
     * 
     * @return bean factory
     */
    protected BeanFactory getBeanFactory() {
        if (this.beanFactory == null) {
            this.beanFactory = findBeanFactory(this.getServletContext());
        }
        return this.beanFactory;
    }

    /**
     * Procura no {@link ServletContext} a {@link BeanFactory}
     * 
     * @param servletContext o {@link ServletContext}
     * @return o {@link BeanFactory}
     */
    public static BeanFactory findBeanFactory(ServletContext servletContext) {
        return WebSpringHelper.getBeanFactory(servletContext);
    }

    /**
     * Devolve um bean, recuperando-o pela beanfactory.
     * 
     * @param <T> tipo do bean.
     * @param name nome do bean.
     * @param clazz tipo do bean.
     * @return bean.
     */
    protected <T> T getBean(String name, Class<T> clazz) {
        return clazz.cast(this.getBeanFactory().getBean(name));
    }

    /**
     * Devolve o valor do parametro ou o valor default caso o parametro nao tenha sido definido.
     * 
     * @param servletConfig configuração do servlet.
     * @param paramName chave do parâmetro.
     * @param defaultValue valor default.
     * @return o valor da propriedade ou <code>defaultValue</code> se a propriedade não estiver definida.
     */
    protected String getParameter(ServletConfig servletConfig, String paramName, String defaultValue) {
        String value = servletConfig.getInitParameter(paramName);
        return (value != null) ? value : defaultValue;
    }
}
